common.skill

LINQ এ সেট অপারেশন (Set Operations in LINQ)

Microsoft Technologies - লিংক (LinQ)
187
187

LINQ তে Set Operations হল এমন অপারেশনগুলো যা ডেটার মধ্যে ইউনিক বা সাধারণ উপাদান বের করতে, বা দুটি বা তার বেশি ডেটা সংগ্রহের মধ্যে সম্পর্ক নির্ধারণ করতে ব্যবহৃত হয়। এটি মূলত ডেটার মিল, পার্থক্য এবং ইউনিয়ন (union) বা ইন্টারসেকশন (intersection) সম্পর্কিত কাজগুলো করতে সহায়ক। LINQ তে Distinct, Union, Intersect, Except ইত্যাদি সেট অপারেশনগুলো পাওয়া যায়, যা ডেটাকে আরও কার্যকরভাবে পরিচালনা করতে ব্যবহৃত হয়।


Distinct (একক উপাদান নির্বাচন)

Distinct অপারেশন ব্যবহার করে আপনি ডেটা সোর্স থেকে পুনরাবৃত্তি উপাদানগুলি সরিয়ে ফেলতে পারেন এবং শুধুমাত্র ইউনিক (unique) উপাদানগুলি নির্বাচন করতে পারেন।

উদাহরণ:

List<int> numbers = new List<int> { 1, 2, 3, 4, 4, 5, 5, 6 };

// Distinct অপারেশন ব্যবহার করে ইউনিক সংখ্যাগুলো বের করা
var distinctNumbers = numbers.Distinct();

foreach (var num in distinctNumbers)
{
    Console.WriteLine(num);  // Output: 1, 2, 3, 4, 5, 6
}

এখানে Distinct ব্যবহার করে রিপিটেড সংখ্যাগুলো যেমন ৪ এবং ৫ সরিয়ে দিয়ে শুধুমাত্র ইউনিক (অপ্রতিরোধ্য) সংখ্যাগুলি ফেরত আসবে।


Union (ইউনিয়ন অপারেশন)

Union অপারেশন দুটি বা তার বেশি ডেটা সোর্সের মধ্যে ইউনিক উপাদানগুলো যোগ করে। যদি দুইটি লিস্টে একই উপাদান থাকে, তবে তা একবারই ফলস্বরূপ থাকবে। এটি মূলত দুইটি সংগ্রহের মিল তৈরি করার জন্য ব্যবহৃত হয়।

উদাহরণ:

List<int> numbers1 = new List<int> { 1, 2, 3, 4 };
List<int> numbers2 = new List<int> { 3, 4, 5, 6 };

// Union অপারেশন ব্যবহার করে দুটি লিস্টের ইউনিয়ন তৈরি করা
var unionResult = numbers1.Union(numbers2);

foreach (var num in unionResult)
{
    Console.WriteLine(num);  // Output: 1, 2, 3, 4, 5, 6
}

এখানে Union অপারেশনটি numbers1 এবং numbers2 লিস্টের মধ্যে মিলিত উপাদানগুলো বের করে, তবে রিপিটেড উপাদানগুলো শুধুমাত্র একবার থাকবে।


Intersect (ইন্টারসেকশন অপারেশন)

Intersect অপারেশন দুটি ডেটা সোর্সের মধ্যে সাধারণ উপাদান বের করতে ব্যবহৃত হয়। এটি দুটি সংগ্রহের মিল (intersection) তৈরি করে এবং কেবল সেই উপাদানগুলো ফেরত দেয় যা উভয় সংগ্রহে বিদ্যমান।

উদাহরণ:

List<int> numbers1 = new List<int> { 1, 2, 3, 4 };
List<int> numbers2 = new List<int> { 3, 4, 5, 6 };

// Intersect অপারেশন ব্যবহার করে দুটি লিস্টের ইন্টারসেকশন বের করা
var intersectResult = numbers1.Intersect(numbers2);

foreach (var num in intersectResult)
{
    Console.WriteLine(num);  // Output: 3, 4
}

এখানে Intersect অপারেশনটি numbers1 এবং numbers2 লিস্টের মধ্যে সাধারণ উপাদানগুলো বের করেছে, অর্থাৎ ৩ এবং ৪।


Except (পার্থক্য অপারেশন)

Except অপারেশন একটি লিস্টের উপাদান অন্য লিস্ট থেকে বাদ দেয়। এটি মূলত একটি সংগ্রহের থেকে অন্য সংগ্রহের উপাদান বাদ দিয়ে বাকি উপাদানগুলো প্রদান করে।

উদাহরণ:

List<int> numbers1 = new List<int> { 1, 2, 3, 4, 5 };
List<int> numbers2 = new List<int> { 4, 5, 6, 7 };

// Except অপারেশন ব্যবহার করে numbers2 থেকে numbers1 বাদ দেওয়া
var exceptResult = numbers1.Except(numbers2);

foreach (var num in exceptResult)
{
    Console.WriteLine(num);  // Output: 1, 2, 3
}

এখানে Except অপারেশনটি numbers1 থেকে numbers2 এর উপাদানগুলো বাদ দিয়ে শুধুমাত্র ১, ২, ৩ উপাদানগুলো ফিরে দিয়েছে।


Set Operations এর ব্যবহার

LINQ তে Set Operations বিভিন্ন প্রকারের ডেটা কন্ট্রোল, যেমন ফিল্টারিং, গ্রুপিং, বা ইউনিক/কমন উপাদান নির্বাচন করতে সহায়ক। এগুলি আপনাকে ডেটার সম্পর্ক এবং মিল বের করতে সাহায্য করে। যদি আপনার ডেটা সোর্সে পুনরাবৃত্তি উপাদান থাকে, তবে Distinct, Union, Intersect, এবং Except এর মাধ্যমে সেগুলি সঠিকভাবে প্রক্রিয়া করা যেতে পারে।


Conclusion

LINQ এর Set Operations ডেটার মিল, পার্থক্য, এবং ইউনিয়ন সম্পর্কে কার্যকরী ধারণা প্রদান করে, এবং এটি ডেটার প্রয়োজনীয় অংশ নির্বাচন করতে সহায়ক। এগুলি মূলত সিস্টেমে ডেটা বিশ্লেষণ এবং প্রক্রিয়া করতে ব্যবহৃত হয়, যা ডেভেলপারদের আরও নমনীয়ভাবে কাজ করতে সাহায্য করে।

common.content_added_by

Distinct, Union, এবং Intersect

231
231

LINQ এ Distinct, Union, এবং Intersect মেথডগুলি আপনাকে বিভিন্ন সংগ্রহের মধ্যে ডুপ্লিকেট অপসারণ এবং সামঞ্জস্যপূর্ণ তথ্য খোঁজা করতে সাহায্য করে। এই তিনটি মেথড আপনার ডেটা ম্যানিপুলেশন বা সংগ্রহের বিভিন্ন প্রয়োজনে কার্যকরী হতে পারে।


Distinct

Distinct মেথডটি একটি সংগ্রহের মধ্যে ডুপ্লিকেট উপাদানগুলি অপসারণ করতে ব্যবহৃত হয়। এটি একটি নতুন সংগ্রহ তৈরি করে, যেখানে শুধুমাত্র ইউনিক (অদ্বিতীয়) উপাদান থাকবে।

উদাহরণ:

List<int> numbers = new List<int> { 1, 2, 3, 3, 4, 5, 5, 6 };

// ডুপ্লিকেট অপসারণ
var distinctNumbers = numbers.Distinct();

foreach (var num in distinctNumbers)
{
    Console.WriteLine(num);  // Output: 1, 2, 3, 4, 5, 6
}

এখানে Distinct() মেথডটি লিস্টের মধ্যে থাকা ডুপ্লিকেট সংখ্যা (যেমন 3 এবং 5) অপসারণ করে শুধুমাত্র ইউনিক সংখ্যা ফিরিয়ে দিয়েছে।


Union

Union মেথডটি দুটি সংগ্রহের মধ্যে অবিচ্ছিন্ন (distinct) উপাদান একত্রিত করতে ব্যবহৃত হয়। এটি দুটি সংগ্রহের একত্রিত (concatenate) উপাদানগুলো থেকে ডুপ্লিকেট অপসারণ করে একটি নতুন সংগ্রহ তৈরি করে।

উদাহরণ:

List<int> list1 = new List<int> { 1, 2, 3, 4 };
List<int> list2 = new List<int> { 3, 4, 5, 6 };

// দুটি লিস্টের ইউনিক উপাদান একত্রিত করা
var unionList = list1.Union(list2);

foreach (var num in unionList)
{
    Console.WriteLine(num);  // Output: 1, 2, 3, 4, 5, 6
}

এখানে, Union মেথড দুটি লিস্টের মধ্যে সাধারণ উপাদানগুলো (৩ এবং ৪) বাদ দিয়ে, সমস্ত ইউনিক উপাদানকে একত্রিত করে একটি নতুন সংগ্রহ তৈরি করেছে।


Intersect

Intersect মেথডটি দুটি সংগ্রহের মধ্যে যে উপাদানগুলি সাধারণ, অর্থাৎ উভয় সংগ্রহেই বিদ্যমান, তা বের করে। এটি দুটি সংগ্রহের সামঞ্জস্যপূর্ণ উপাদান রিটার্ন করে এবং ডুপ্লিকেটগুলো বাদ দেয়।

উদাহরণ:

List<int> list1 = new List<int> { 1, 2, 3, 4 };
List<int> list2 = new List<int> { 3, 4, 5, 6 };

// দুটি লিস্টের সাধারণ (common) উপাদান খোঁজা
var intersectList = list1.Intersect(list2);

foreach (var num in intersectList)
{
    Console.WriteLine(num);  // Output: 3, 4
}

এখানে Intersect মেথডটি দুটি লিস্টের মধ্যে যে উপাদানগুলো উভয়েই রয়েছে (৩ এবং ৪), তা একত্রিত করে রিটার্ন করেছে।


Distinct, Union, এবং Intersect এর মধ্যে পার্থক্য

  • Distinct: একটি একক সংগ্রহের মধ্যে ডুপ্লিকেট উপাদানগুলো অপসারণ করে ইউনিক উপাদান রিটার্ন করে।
  • Union: দুটি সংগ্রহের একত্রিত ইউনিক উপাদানগুলোর সমন্বয় করে, অর্থাৎ দুটি সংগ্রহের সব ইউনিক উপাদান একত্রিত হয়।
  • Intersect: দুটি সংগ্রহের মধ্যে যে উপাদানগুলো সাধারণ, অর্থাৎ উভয়েই বিদ্যমান, সেগুলি বের করে।

আরও উদাহরণ: বিভিন্ন ডেটাটাইপের সঙ্গে ব্যবহার

Distinct on Objects

ধরা যাক, আমাদের একটি Employee ক্লাস রয়েছে এবং আমরা একই নামের কর্মীদের অপসারণ করতে চাই।

public class Employee
{
    public string Name { get; set; }
    public int Age { get; set; }
}

List<Employee> employees = new List<Employee>
{
    new Employee { Name = "Alice", Age = 25 },
    new Employee { Name = "Bob", Age = 30 },
    new Employee { Name = "Alice", Age = 28 },
    new Employee { Name = "Charlie", Age = 35 }
};

// Distinct - Name অনুযায়ী ইউনিক কর্মী নির্বাচন
var distinctEmployees = employees.Distinct().ToList();

foreach (var emp in distinctEmployees)
{
    Console.WriteLine($"Name: {emp.Name}, Age: {emp.Age}");
}

এখানে Distinct() দ্বারা একই নামের কর্মী গুলি অপসারণ করা হবে।

Union with Objects

List<Employee> list1 = new List<Employee>
{
    new Employee { Name = "Alice", Age = 25 },
    new Employee { Name = "Bob", Age = 30 }
};

List<Employee> list2 = new List<Employee>
{
    new Employee { Name = "Bob", Age = 30 },
    new Employee { Name = "Charlie", Age = 35 }
};

// দুটি লিস্টের ইউনিক কর্মী একত্রিত করা
var unionEmployees = list1.Union(list2, new EmployeeComparer()).ToList();

foreach (var emp in unionEmployees)
{
    Console.WriteLine($"Name: {emp.Name}, Age: {emp.Age}");
}

এখানে, EmployeeComparer একটি custom comparer যা Name এবং Age প্রপার্টির উপর ভিত্তি করে কর্মীদের তুলনা করে।

Intersect with Objects

List<Employee> list1 = new List<Employee>
{
    new Employee { Name = "Alice", Age = 25 },
    new Employee { Name = "Bob", Age = 30 }
};

List<Employee> list2 = new List<Employee>
{
    new Employee { Name = "Bob", Age = 30 },
    new Employee { Name = "Charlie", Age = 35 }
};

// দুটি লিস্টের সাধারণ (common) কর্মী খোঁজা
var intersectEmployees = list1.Intersect(list2, new EmployeeComparer()).ToList();

foreach (var emp in intersectEmployees)
{
    Console.WriteLine($"Name: {emp.Name}, Age: {emp.Age}");
}

এখানে Intersect মেথডটি Bob নামের কর্মীকে উভয় লিস্টের মধ্যে সাধারণ উপাদান হিসেবে নির্বাচন করবে।


সারাংশ

  • Distinct: একটি সংগ্রহের মধ্যে ডুপ্লিকেট উপাদান অপসারণ করে ইউনিক উপাদানগুলো রিটার্ন করে।
  • Union: দুটি সংগ্রহের ইউনিক উপাদানগুলো একত্রিত করে, ডুপ্লিকেটগুলো বাদ দেয়।
  • Intersect: দুটি সংগ্রহের মধ্যে সাধারণ উপাদানগুলো বের করে, অর্থাৎ যেগুলি উভয়েই রয়েছে।

এই তিনটি মেথডটি ডেটা ম্যানিপুলেশন এবং ফিল্টারিং এর ক্ষেত্রে খুবই কার্যকরী।

common.content_added_by

Except Method

230
230

LINQ Except মেথড ব্যবহার করে একটি ডেটা সংগ্রহ থেকে অন্য একটি ডেটা সংগ্রহের উপাদানগুলো বাদ দিতে পারেন। এটি দুটি সংগ্রহের মধ্যে যেসব উপাদান প্রথম সংগ্রহে আছে কিন্তু দ্বিতীয় সংগ্রহে নেই, সেই উপাদানগুলো প্রদান করে। সহজভাবে বললে, Except মেথডটি দুটি সংগ্রহের পার্থক্য বের করে দেয়।


Except Method এর কার্যপদ্ধতি

Except মেথড দুটি সংগ্রহের উপাদান তুলনা করে এবং প্রথম সংগ্রহের এমন উপাদানগুলোকেই নির্বাচন করে যেগুলি দ্বিতীয় সংগ্রহে নেই। এটি সাধারণত ডেটার তুলনা এবং ফিল্টারিং করতে ব্যবহৃত হয়।


Syntax:

IEnumerable<T> Except(IEnumerable<T> second);

এখানে:

  • T: উপাদানের ধরন (যেমন, int, string, বা যে কোনো কাস্টম টাইপ)
  • second: দ্বিতীয় সংগ্রহ (যা প্রথম সংগ্রহের উপাদানগুলোর সঙ্গে তুলনা করা হয়)

উদাহরণ:

ধরা যাক, আপনার কাছে দুটি তালিকা রয়েছে, এবং আপনি চান যে প্রথম তালিকার এমন উপাদানগুলো বের করা হোক, যেগুলি দ্বিতীয় তালিকায় নেই।

List<int> list1 = new List<int> { 1, 2, 3, 4, 5 };
List<int> list2 = new List<int> { 3, 4, 5, 6, 7 };

// Except ব্যবহার করে list1 থেকে list2 এর উপাদান বাদ দেওয়া
var result = list1.Except(list2);

foreach (var item in result)
{
    Console.WriteLine(item);  // Output: 1, 2
}

এখানে Except মেথডটি list1 থেকে 3, 4, 5 বাদ দিয়ে 1, 2 উপাদানগুলো ফিরিয়ে দিয়েছে, কারণ এই উপাদানগুলো list2 তে নেই।


কিছু গুরুত্বপূর্ণ বিষয়:

  • Distinct: Except মেথডটি Distinct মেথডের মতোই কাজ করে, কারণ এটি প্রতিটি উপাদান একবারই ফেরত দেয়। অর্থাৎ, যদি প্রথম সংগ্রহে কোনো ডুপ্লিকেট উপাদান থাকে, তবে সেগুলি বাদ দিয়ে শুধুমাত্র ইউনিক (distinct) মানগুলো ফেরত পাওয়া যায়।
  • Order Preservation: Except মেথডটি প্রথম সংগ্রহের উপাদানের ক্রম (order) সংরক্ষণ করে, অর্থাৎ যেভাবে প্রথম সংগ্রহে উপাদানগুলো সাজানো ছিল, সেভাবেই সেগুলি ফিরে আসবে।
  • Custom Objects: যদি আপনি কাস্টম অবজেক্ট ব্যবহার করেন, তবে Except সঠিকভাবে কাজ করবে না যতক্ষণ না আপনি সেই অবজেক্টের সমতা নির্ধারণ (equality comparison) সঠিকভাবে সেট না করেন। এর জন্য আপনাকে IEqualityComparer<T> ইন্টারফেস ইমপ্লিমেন্ট করতে হবে।

Custom Objects Example:

ধরা যাক, আপনার কাছে একটি কাস্টম ক্লাস Person আছে এবং আপনি দুইটি List এর মধ্যে পার্থক্য বের করতে চান:

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public override bool Equals(object obj)
    {
        var person = obj as Person;
        return person != null && Name == person.Name && Age == person.Age;
    }

    public override int GetHashCode()
    {
        return Name.GetHashCode() ^ Age.GetHashCode();
    }
}

List<Person> list1 = new List<Person>
{
    new Person { Name = "Alice", Age = 30 },
    new Person { Name = "Bob", Age = 25 },
    new Person { Name = "Charlie", Age = 35 }
};

List<Person> list2 = new List<Person>
{
    new Person { Name = "Alice", Age = 30 },
    new Person { Name = "David", Age = 40 }
};

// Except ব্যবহার করে list1 থেকে list2 এর Person বাদ দেওয়া
var result = list1.Except(list2);

foreach (var person in result)
{
    Console.WriteLine($"{person.Name}, {person.Age}");
    // Output: Bob, 25
    //         Charlie, 35
}

এখানে Equals এবং GetHashCode মেথডটি Person ক্লাসে কাস্টমাইজ করা হয়েছে যাতে Except সঠিকভাবে Person অবজেক্টগুলির তুলনা করতে পারে।


Conclusion

LINQ এর Except মেথড দুটি সংগ্রহের মধ্যে যেসব উপাদান একত্রে থাকে না, শুধুমাত্র সেগুলিকে বের করে। এটি ডেটা ফিল্টার এবং তুলনা করার জন্য অত্যন্ত কার্যকরী, বিশেষ করে যখন আপনাকে দুটি সংগ্রহের পার্থক্য বের করতে হয়।

common.content_added_by

LINQ এর মাধ্যমে ডুপ্লিকেট ডেটা ফিল্টার করা

168
168

LINQ ব্যবহার করে ডুপ্লিকেট ডেটা ফিল্টার করা বা অপসারণ করা খুবই সহজ। এর জন্য Distinct() মেথডটি ব্যবহার করা হয়। এই মেথডটি একটি সংগ্রহের মধ্যে থেকে শুধুমাত্র ইউনিক (অব্যক্ত) মানগুলি ফিরিয়ে আনে, অর্থাৎ যেসব মান একাধিকবার রয়েছে, সেগুলো শুধুমাত্র একবার প্রদর্শিত হবে।


Distinct() মেথড ব্যবহার (Method Syntax)

Distinct() মেথড একটি সংগ্রহ বা সিকোয়েন্স থেকে ডুপ্লিকেট উপাদানগুলো সরিয়ে ফেলতে সাহায্য করে। এটি method syntax এর মাধ্যমে ব্যবহার করা হয়, যেমন:

উদাহরণ:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 1, 2, 6, 7, 3 };

// Distinct() ব্যবহার করে ডুপ্লিকেট অপসারণ করা
var distinctNumbers = numbers.Distinct();

foreach (var number in distinctNumbers)
{
    Console.WriteLine(number);  // Output: 1, 2, 3, 4, 5, 6, 7
}

এখানে, Distinct() মেথড ব্যবহার করে numbers লিস্ট থেকে ডুপ্লিকেট সংখ্যা গুলো সরিয়ে দেয়া হয়েছে।


Distinct() ব্যবহার (Query Syntax)

Query syntax ব্যবহার করে Distinct() মেথড ব্যবহার করতে হলে আপনি distinct কিওয়ার্ড ব্যবহার করবেন, যেমন:

উদাহরণ:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 1, 2, 6, 7, 3 };

// Distinct() ব্যবহার করে ডুপ্লিকেট অপসারণ করা (Query Syntax)
var distinctNumbers = from num in numbers
                      select num;
                      
foreach (var number in distinctNumbers.Distinct())
{
    Console.WriteLine(number);  // Output: 1, 2, 3, 4, 5, 6, 7
}

এখানে, distinct কিওয়ার্ড ব্যবহার করে লিস্ট থেকে ডুপ্লিকেট মানগুলি সরিয়ে দেয়া হয়েছে।


কাস্টম অবজেক্টের জন্য Distinct()

যদি আপনার ডেটা একটি কাস্টম অবজেক্টের লিস্ট হয় (যেমন একটি Person ক্লাস), এবং আপনি চান যে একাধিক কাস্টম অবজেক্টের মধ্যে যদি কোন প্রপার্টি বা ক্ষেত্রের মান সমান হয়, তবে তা ডুপ্লিকেট হিসেবে গণ্য হবে, তাহলে Distinct() ব্যবহারের জন্য IEqualityComparer ইন্টারফেসটি ব্যবহার করতে হয়।

উদাহরণ:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

List<Person> people = new List<Person>
{
    new Person { Name = "Alice", Age = 30 },
    new Person { Name = "Bob", Age = 25 },
    new Person { Name = "Alice", Age = 30 },
    new Person { Name = "Charlie", Age = 35 }
};

// Custom Distinct (Name এবং Age এর ভিত্তিতে)
var distinctPeople = people.Distinct(new PersonComparer());

foreach (var person in distinctPeople)
{
    Console.WriteLine($"{person.Name}, {person.Age}");
}

// Custom IEqualityComparer
public class PersonComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        if (x == null || y == null)
            return false;

        return x.Name == y.Name && x.Age == y.Age;
    }

    public int GetHashCode(Person obj)
    {
        return obj.Name.GetHashCode() ^ obj.Age.GetHashCode();
    }
}

এখানে:

  • PersonComparer একটি কাস্টম IEqualityComparer ক্লাস যা Name এবং Age এর ভিত্তিতে দুইটি Person অবজেক্টের সমানতা পরীক্ষা করে।
  • Distinct() মেথড এই কাস্টম কম্পেয়ারার ব্যবহার করে ডুপ্লিকেট Person অবজেক্টগুলো সরিয়ে ফেলছে।

আউটপুট:

Alice, 30
Bob, 25
Charlie, 35

এখানে, একই নাম এবং বয়সের দুটি Person অবজেক্টকে ডুপ্লিকেট হিসেবে ধরা হয়েছে এবং শুধুমাত্র একবার প্রদর্শন করা হয়েছে।


Distinct() মেথডের সীমাবদ্ধতা

  • Primitive Types: Distinct() মেথডটি শুধুমাত্র সাদামাটা (primitive) ধরনের ডেটার জন্য কাজ করে, যেমন int, string, float ইত্যাদি।
  • Custom Types: কাস্টম অবজেক্টের জন্য Distinct() কাজ করবে না যদি না আপনি IEqualityComparer ইন্টারফেস প্রয়োগ না করেন, কারণ LINQ ডুপ্লিকেট চেক করতে অবজেক্টের সমানতা নির্ধারণের জন্য একটি কাস্টম তুলনা প্রয়োজন।

সারাংশ

LINQ এর Distinct() মেথড ব্যবহার করে ডুপ্লিকেট ডেটা সহজে ফিল্টার করা সম্ভব। এটি List, Array, বা যে কোন আইটেমের সিকোয়েন্সের মধ্যে ডুপ্লিকেট উপাদান সরিয়ে ফেলতে সাহায্য করে। কাস্টম অবজেক্টের জন্য IEqualityComparer প্রয়োগের মাধ্যমে ডুপ্লিকেট চেক করা যায়।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion